<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Configuration" %>

<script runat="server">
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
        Dim DBCon As SqlConnection
        Dim OrdersCommand As SqlCommand = New SqlCommand()
        Dim CustCommand As SqlCommand = New SqlCommand()
        Dim OrdersReader As SqlDataReader
        Dim CustReader As SqlDataReader
        Dim OrdersASyncResult As IAsyncResult
        Dim CustAsyncResult As IAsyncResult

        Dim WHandles(1) As System.Threading.WaitHandle
        Dim OrdersWHandle As System.Threading.WaitHandle
        Dim CustWHandle As System.Threading.WaitHandle

        DBCon = New SqlConnection()
        DBCon.ConnectionString = ConfigurationManager.ConnectionStrings("DSN_NorthWind").ConnectionString

        CustCommand.CommandText = "SELECT * FROM Customers WHERE CompanyName = 'Alfreds Futterkiste'"

        CustCommand.CommandType = CommandType.Text
        CustCommand.Connection = DBCon

        ' Pobranie wszystkich zamwie danego klienta  
        OrdersCommand.CommandText = 
                "SELECT Customers.CompanyName, Customers.ContactName, " & 
                "Orders.OrderID, Orders.OrderDate, " & 
                "Orders.RequiredDate, Orders.ShippedDate " & 
                "FROM Orders, Customers " & 
                "WHERE Orders.CustomerID = Customers.CustomerID " & 
                "AND Customers.CompanyName = 'Alfreds Futterkiste' " & 
                "ORDER BY Customers.CompanyName, Customers.ContactName"

        OrdersCommand.CommandType = CommandType.Text
        OrdersCommand.Connection = DBCon

        DBCon.Open()

        ' Asynchroniczne pobranie informacji o kliencie
        CustAsyncResult = CustCommand.BeginExecuteReader()

        ' Asynchroniczne pobranie listy zamwie
        OrdersASyncResult = OrdersCommand.BeginExecuteReader()

        CustWHandle = CustAsyncResult.AsyncWaitHandle
        OrdersWHandle = OrdersASyncResult.AsyncWaitHandle

        ' Wypenienie tablicy uchwytw dwoma uchwytami, ktre
        ' zamierzamy uy w tym kodzie
        WHandles(0) = CustWHandle
        WHandles(1) = OrdersWHandle

        System.Threading.WaitHandle.WaitAll(WHandles)

        CustReader = CustCommand.EndExecuteReader(CustAsyncResult)

        OrdersReader = OrdersCommand.EndExecuteReader(OrdersASyncResult)

        gvCustomers.DataSource = CustReader
        gvCustomers.DataBind()

        gvOrders.DataSource = OrdersReader
        gvOrders.DataBind()

        DBCon.Close()
    End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Oczekiwanie na wiele uchwytw</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:GridView ID="gvCustomers" Width="100%" runat="server"></asp:GridView>
    <br /><br />
    <asp:GridView ID="gvOrders" Width="100%" AutoGenerateColumns="False"         
     runat="server">
       <Columns>
          <asp:BoundField HeaderText="Nazwa firmy" 
           DataField="CompanyName"></asp:BoundField>
          <asp:BoundField HeaderText="Kontakt" 
           DataField="ContactName"></asp:BoundField>
          <asp:BoundField HeaderText="Data zamwienia" DataField="orderdate" 
           DataFormatString="{0:d}"></asp:BoundField>
          <asp:BoundField HeaderText="Wymagana data dostawy" DataField="requireddate" 
           DataFormatString="{0:d}"></asp:BoundField>
          <asp:BoundField HeaderText="Data dostawy" DataField="shippeddate" 
           DataFormatString="{0:d}"></asp:BoundField>
       </Columns>
    </asp:GridView>
    </div>
    </form>
</body>
</html>
